/*
 * StringUtils.h
 *
 *  Created on: 01/05/2012
 *      Author: alex
 */

#ifndef STRINGUTILS_H_
#define STRINGUTILS_H_

#include <sstream>
#include <iostream>
#include <vector>
#include <iomanip>
#include <ctype.h>

/**
 * Funciones auxiliares para strings
 */
class StringUtils
{
public:

	/**
	 * Parte un string delimitado por caracteres, en un vector de
	 * strings
	 * @param serialized el string serializado
	 * @param delim delimitador a utilizar
	 * @return vector<string> Vector con los items separados
	 */
	static std::vector<std::string>splitString(std::string serialized,
											char delim);

	/**
	 * Convierte un elemento de un tipo a string.
	 * Los tipos de datos que se pueden convertir estan dados por
	 * stringstream
	 */
	template <typename T>
	static std::string NumberToString ( T Number )
	{
		std::stringstream ss;
		ss << Number;
		return ss.str();
	}

	static std::string itos(int n);
	static std::string btos(bool b);

	/**
	 * Convierte un string a un elemento de un tipo dado.
	 * Los tipos de datos que se pueden convertir estan dados por
	 * stringstream
	 */
	template <typename T>
	static T StringToNumber ( const std::string& Text )
	{
		std::stringstream ss(Text);
		T result;
		return ss >> result ? result : 0;
	}

	static std::string toHexaString(const char *stream, unsigned int size)
	{
		int fin =size;
		std::stringstream ss;
		for(int i=0; i<fin; i++)
		{
				if (i%2==0)
				ss << " ";
				ss << std::setfill('0') << std::setw(2) << std::hex << ((0x00FF)&(unsigned int)stream[i]);
				//cout.flush();
		}

		return ss.str();
	}

	static std::string toLower(std::string str);

	static bool equals(std::string str1, std::string str2, bool ignoreCase);

    // trim from start
    static std::string& ltrim( std::string& s );

    // trim from end
    static std::string& rtrim( std::string& s );

    // trim from both ends
    static std::string& trim( std::string& s );
};

#endif /* STRINGUTILS_H_ */
